1

首先,如果这个问题对于这个论坛来说太基本了,我很抱歉。我对此很陌生,并且正在努力应对许多基础知识 - 但我坚持不懈!

我有一个问题,我想创建一个带有 WHERE 子句的 LINQ to SQL 查询,该子句间接引用我的数据库中的一列。例如,如果我有一些看起来像这样的代码:

var PLMatches = from PLMat in db1.PLAccountHeaders
              where PLMat.CompanyAlphaId.Equals(CoId)
              && dbField.Equals(Limit)
              select PLMat;

这样 dbField 将是一个包含数据库字段名称的变量。因此,如果 dbField 的值是“PLMat.ItemCode”,它会很高兴地消失并返回 ItemCode 等于 Limit 值的所有记录实例,如果 dbField 的值是“PLMat.ItemName”,它会很高兴地消失并且返回 ItemName 等于 Limit 值的所有记录实例,依此类推。

我真的很感激这两个方面的帮助来回答一个非常具体的问题,我相信它会增强我的基本理解。

非常感谢

4

2 回答 2

0

我认为您所要求的在 LINQ 中是不可能的,但是您可以使用动态 Linq 库。

这是链接

您下载 zip,解压缩,然后在您的解决方案中引用它。

然后你可以做这样的事情:

// the "normal" LINQ way:
    var query = from x in ctx.People
                        where x.city == "Boston" && x.age > 18
                        orderby x.ID
                        select x;


// the Dynamic Linq way:
    var query = database.People
                        .Where("city = Boston AND age > 18")
                        .OrderBy("id")
                        .Select("New(Person as Name, Age)"); 
于 2012-09-16T11:10:27.403 回答
0

另一种方法(除了动态 linq)是有条件地编写查询。像这样:

var PLMatches = from PLMat in db1.PLAccountHeaders
              where PLMat.CompanyAlphaId.Equals(CoId)
              select PLMat;
if (dbField == "ItemCode")
    PLMatches = PLMatches.Where(m => m.ItemCode == Limit);
else if (dbField == "ItemName")
    PLMatches = PLMatches.Where(m => m.ItemName == Limit);
else if (dbField == ...

代码看起来有点重复,但如果可能条件的数量不太大,我总是更喜欢这样做。优点是,首先,代码完整性检查是在编译时而不是在运行时进行的(与动态 linq 一样),其次,代码的内容非常清楚。(第二个优点也适用于动态 linq,但对于第三种选择来说则不那么重要:在代码中构建表达式)。

由于延迟执行,您可以通过这种方式编写 linq 查询。PLMatches = PLMatches.Where...仅更改查询,但尚未执行任何操作。

于 2012-09-16T18:55:38.373 回答