回答

收藏

使用实体框架在运行时动态选择列

技术问答 技术问答 112 人阅读 | 0 人回复 | 2023-09-13

我有这样的现有功能% M; S8 I% P; l
public int sFunc(string sCol , int iId)
- x! M- ?6 D" N' T& I$ r' U{
5 R, P8 x8 f& Z# u    string sSqlQuery = "  select  " + sCol + " from TableName where ID = " +  iId ;9 I' N( i! s$ W9 z) V
    // Executes query and returns value in column sCol" i" }; ]5 q- _' l9 s- @
}7 b4 p/ {$ k4 ^  l
该表有四列来存储整数值,我正在使用上述功能分别读取它们。4 }: K6 j. V2 V3 f. ?) V& K
现在,我将其转换为Entity Framework。+ Z7 T' |' _5 r( ]( P
public int sFunc(string sCol , int iId)
6 _3 `$ v. C8 W+ |4 b+ ?{
1 m/ P5 P+ F) j1 d     return Convert.ToInt32(TableRepository.Entities.Where(x => x.ID == iId).Select(x => sCol ).FirstOrDefault());
( t) a7 V$ `: S3 ^2 s}
- A% u1 q+ {* V3 \$ ^9 F# T% k- I但是上面的函数返回一个错误
- \% g+ O. [6 @
, v/ E5 Y- a5 G0 E输入的字符串格式不正确
( c, J/ i5 m  x' ^& b

5 b# h7 {9 v% S1 N) g, ~7 U/ F因为它返回列名本身。0 z: M3 P1 S0 B6 V# `' J# L; @
我不知道如何解决这个问题,因为我是EF的新手。
1 `& S0 p' w0 e4 a. f任何帮助,将不胜感激
4 @# h- j( Y+ z! b2 @, I+ N谢谢- n2 u9 I0 M! X1 C
                5 T3 L  l( M8 n5 P& c* ]+ j2 A
解决方案:  h- ^# h3 j% B) S0 l* y! n6 \
               
6 Q* {" O) r) j* I4 r! X3 K9 {) K7 s. x1 C

0 O; u7 b1 e; g. j$ q! A, {5 m                这可能有助于解决您的问题:
; f+ r* x' J% M. {! k+ Apublic int sFunc(string sCol, int iId)
! X6 w; n- V  K) L: ]# O5 j{' S9 n% h- ?5 N! d8 U8 E
    var _tableRepository = TableRepository.Entities.Where(x => x.ID == iId).Select(e => e).FirstOrDefault();
8 r6 N1 u4 r* T( q" F1 V! v3 B    if (_tableRepository == null) return 0;: _! P) e) |. R; g9 ^4 B" c6 P
    var _value = _tableRepository.GetType().GetProperties().Where(a => a.Name == sCol).Select(p => p.GetValue(_tableRepository, null)).FirstOrDefault();
1 G- N0 S: M5 x% Z1 b  ]4 U6 E9 J! ~    return _value != null ? Convert.ToInt32(_value.ToString()) : 0;
& C1 ]* d: ~" M+ S, x+ l3 V}
2 D1 _' ?4 C# c) X. e2 s现在,该方法适用于动态输入方法参数sCol。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则