在LINQ语句中调用数据库内置函数仅适用于实际应用程序中的单元测试或

时间:2017-11-13 13:00:09

标签: c# entity-framework linq unit-testing

我得到了一个巨大的LINQ语句,其中包含多个条件的多个连接。我需要在其中一个连接中使用数据库函数(DatePart,DiffDays)。我使用Moq进行单元测试。由于这些DBFunction只能通过静态方法调用,所以我无法模拟这些方法。如果我通过SqlFunctions或EntityFunctions调用它们,我会得到一个NotSupportedException(“这个函数只能从LINQ to Entities调用。”),但是我的应用程序工作正常。如果我使用System.Data.Entity.DbFunction它也适用于我的应用程序,但不适用于我的单元测试。

我缩短了LINQ-Statement,实际上它包含了更多的连接:

 var resultQuery = from t1 in ctx.Table1.AsNoTracking()    
                              join t2 in ctx.Table2 on new
                              {
//works for application, but not in Unit-Test, firstMonday is a predefined DateTime-variable
                                  z3 = (int)EntityFunctions.DiffDays(firstMonday, t1.Date)%7,
//works only in Application, but not in Unit-Test
                                  z4 = SqlFunctions.DatePart("wk", t2.Date)
                              } equals new
                              {
                                  z3 = (int)t2.Day,         
                                  z4 = SqlFunctions.DatePart("wk", t2.BeginDate)
                              }  into tGroup

                              from x in tGroup.DefaultIfEmpty()
                              where
[...]
//Class DataTransferObjekt defined to hold attributes of both tables

                    select new DataTransferObject
                    {
                        Id = t1.Id,
                        Date = t1.Date,
                        [...]
                        T2Id = t2.ID
                    };

我做了很多尝试并做了很多研究。我在这里找到的最佳方法: EntityFunctions.TruncateTime and unit tests

但我无法将提供的解决方案转移到我的特殊情况,因为我的条件是连接的一部分,并且使用第二个答案中提供的System.Data.Entity.DbFunction的解决方案也不适用于单元测试如前所述。

任何帮助都会受到赞赏,我在Moq和LINQ中仍然很新!

0 个答案:

没有答案