0

我必须使用 LINQ 在 C# 中进行一些查询。我用 SQL 请求尝试了我的逻辑。它看起来像这样:

SELECT DISTINCT test_laktationen.lom, test_laktationen.laktanfang, test_laktationen.laktende, b_milch_hms_diagnose.diagnose
FROM            test_laktationen INNER JOIN
                         b_milch_hms_diagnose ON test_laktationen.lom = b_milch_hms_diagnose.lom AND b_milch_hms_diagnose.behanddatum BETWEEN 
                         test_laktationen.laktanfang AND test_laktationen.laktende INNER JOIN
                         b_milch_hms_kalbung ON test_laktationen.lom = b_milch_hms_kalbung.lom AND test_laktationen.laktanfang = b_milch_hms_kalbung.kalbedatum
WHERE        (b_milch_hms_diagnose.diagnose LIKE '6.01.01.%' OR
                         b_milch_hms_diagnose.diagnose LIKE '6.01.02.%' OR
                         b_milch_hms_diagnose.diagnose LIKE '6.01.03.%' OR
                         b_milch_hms_diagnose.diagnose LIKE '6.01.04.%') AND (b_milch_hms_kalbung.gebverlauf = 3 OR
                         b_milch_hms_kalbung.gebverlauf = 4)

这就像它应该的那样工作,但现在我必须从数据表中提出这个请求。LINQ可以做到这一点吗?解决这个问题的好做法是什么?

4

1 回答 1

1

您将需要一个数据上下文来执行直接访问。我会推荐 Linq2Sql 类文件 (*.dbml) 来启动它。使用服务器资源管理器在 Linq2Sql 类中创建数据结构后,您的 linq 语句将如下所示:

var context = new MyLinq2SqlContext();

var results = (from lak in context.test_laktationen
    join milch in context.b_milch_hms_diagnose
        on lak.lom equals milch.lom
    join kalbung in context.b_milch_hms_kalbung 
        on lak.lom equals kalbung.lom and lak.laktanfang equals kalbung.kalbedatum
    where 
        (milch.diagnose.StartsWith("6.01.01") ||
        milch.diagnose.StartsWith("6.01.02") ||
        milch.diagnose.StartsWith("6.01.03") ||
        milch.diagnose.StartsWith("6.01.04")) &&
       (kalbung.gebverlaug == 3 || kalbung.geberlauf == 4) &&
       ((milch.behanddatum > lak.laktanfang && milch.behanddatum < lak.laktende) ||     (milch.behanddatum < lak.laktanfang && milch.behanddatum > lak.laktende))
    select new {
            lak.lom, 
            lak.laktanfang,
            lak.laktende,
            milch.diagnose
    }).Distinct();

这可能需要在最后的“where”子句中进行调整,以确保“between”部分正确。BETWEEN不会从 Linq 本地转换为,但只要您可以预测哪个值可能更大,就可以对其进行编码。

于 2012-11-26T14:33:39.180 回答