Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能将LINQtoXML与LINQtoSQL结合起来?_C#_Linq_Linq To Sql_Linq To Xml - Fatal编程技术网

C# 为什么不能将LINQtoXML与LINQtoSQL结合起来?

C# 为什么不能将LINQtoXML与LINQtoSQL结合起来?,c#,linq,linq-to-sql,linq-to-xml,C#,Linq,Linq To Sql,Linq To Xml,我有一段代码: var xml = XDocument.Load(filePath); var taxReturns = (from t in xml.Descendants("aangiftes").Elements() where t.Name == "ib" select new Domain.TaxReturn { FiscalNumber = t.Attribute("sofinr").Value, Guid = Guid.Par

我有一段代码:

var xml = XDocument.Load(filePath);
var taxReturns = (from t in xml.Descendants("aangiftes").Elements()
    where t.Name == "ib"
    select new Domain.TaxReturn
    {
        FiscalNumber = t.Attribute("sofinr").Value,
        Guid = Guid.Parse(t.Attribute("guid").Value),
        LastFormOpen = t.Attribute("lastformview").Value,
        Name = string.Empty, 
        TaxYear = t.GetAttributeValue<short>("belastingjaar"),
        TaxForm =  unitOfWork.TaxForms.FirstOrDefault(tf => tf.Code == t.Attribute("biljetsoort").Value),
    }).ToArray();
运行此代码时,会出现以下异常:

LINQ to Entities无法识别方法System.Xml.LINQ.XAttribute AttributeSystem.Xml.LINQ.XName-method,并且无法将此方法转换为存储表达式

然而,当我将这一行提取到一个方法中时,它工作得很好


有人能解释一下这种行为吗?我不理解这种行为:/

如文档中所述-

当应用程序运行时,LINQtoSQL将对象模型中集成查询的语言转换为SQL,并将它们发送到数据库执行

仔细检查执行顺序,首先生成SQL,然后执行

你很容易理解为什么会发生这种情况。SQL中没有System.Xml.Linq.XAttribute AttributeSystem.Xml.Linq.XName的替代品

例如,OrderBy有一个SQL等价的OrderBy,因此当LINQ看到这个方法时,它会将其转换为OrderBy,然后执行查询。但是当linq看到System.Xml.linq.XAttribute AttributeSystem.Xml.linq.XName时,没有与此对应的SQL,linq抛出一个错误,表示它无法识别它


但是,当您将行提取到一个方法中时,首先执行该方法,因此此时LINQ to SQL已经工作,您要查找的所有实体都被带到RAM中,现在您可以执行任何LINQ to XML。这一次查询不会转换为SQL,因为实体已经作为托管对象存在于RAM中,并且您的代码工作正常。

如文档中所述-

当应用程序运行时,LINQtoSQL将对象模型中集成查询的语言转换为SQL,并将它们发送到数据库执行

仔细检查执行顺序,首先生成SQL,然后执行

你很容易理解为什么会发生这种情况。SQL中没有System.Xml.Linq.XAttribute AttributeSystem.Xml.Linq.XName的替代品

例如,OrderBy有一个SQL等价的OrderBy,因此当LINQ看到这个方法时,它会将其转换为OrderBy,然后执行查询。但是当linq看到System.Xml.linq.XAttribute AttributeSystem.Xml.linq.XName时,没有与此对应的SQL,linq抛出一个错误,表示它无法识别它


但是,当您将行提取到一个方法中时,首先执行该方法,因此此时LINQ to SQL已经工作,您要查找的所有实体都被带到RAM中,现在您可以执行任何LINQ to XML。这一次查询不会转换为SQL,因为实体已经作为托管对象存在于RAM中,并且您的代码工作正常。

这是因为LINQ尝试将Domain.TaxReturn{…}内的代码编译为SQL。SQL中没有XElement.Attribute的对应API。。。所以它失败了

尝试将依赖XElement的代码移到域之外。TaxReturn{…} 像这样:

var xml = XDocument.Load(filePath);
var taxReturns = (from t in xml.Descendants("aangiftes").Elements()
    where t.Name == "ib"
    let sofinr = t.Attribute("sofinr").Value
    let guid = Guid.Parse(t.Attribute("guid").Value)
    let lastformview = t.Attribute("lastformview").Value
    let belastingjaar = t.GetAttributeValue<short>("belastingjaar")
    let biljetsoort = t.Attribute("biljetsoort").Value
    select new Domain.TaxReturn
    {
        FiscalNumber = sofinr ,
        Guid = guid,
        LastFormOpen = lastformview,
        Name = string.Empty, 
        TaxYear = belastingjaar,
        TaxForm = unitOfWork.TaxForms.Single(tf => tf.Code == biljetsoort),
    }).ToArray();
未经测试


另外,您可能希望使用Enumerable.Single而不是Enumerable.FirstOrDefault,或者null是否为有效的大小写?

这是因为LINQ试图将Domain.TaxReturn{…}内的代码编译为SQL。SQL中没有XElement.Attribute的对应API。。。所以它失败了

尝试将依赖XElement的代码移到域之外。TaxReturn{…} 像这样:

var xml = XDocument.Load(filePath);
var taxReturns = (from t in xml.Descendants("aangiftes").Elements()
    where t.Name == "ib"
    let sofinr = t.Attribute("sofinr").Value
    let guid = Guid.Parse(t.Attribute("guid").Value)
    let lastformview = t.Attribute("lastformview").Value
    let belastingjaar = t.GetAttributeValue<short>("belastingjaar")
    let biljetsoort = t.Attribute("biljetsoort").Value
    select new Domain.TaxReturn
    {
        FiscalNumber = sofinr ,
        Guid = guid,
        LastFormOpen = lastformview,
        Name = string.Empty, 
        TaxYear = belastingjaar,
        TaxForm = unitOfWork.TaxForms.Single(tf => tf.Code == biljetsoort),
    }).ToArray();
未经测试


另外,您可能希望使用Enumerable.Single而不是Enumerable.FirstOrDefault,或者null是有效的情况吗?

当您出现错误时,它试图将FirstOrDefault调用中的表达式转换为SQL,但失败。LINQ到SQL在这里起作用的是什么?你是说LINQ对实体吗?@BenRobinson,你能详细说明一下吗?@Rik unitOfWork是围绕DbContext的一个包装器。unitOfWork转到数据库当您收到错误时,它正在尝试将FirstOrDefault调用中的表达式转换为SQL,但失败。LINQ to SQL在这里起到了什么作用?你是说LINQ对实体吗?@BenRobinson,你能详细说明一下吗?@Rik unitOfWork是围绕DbContext的一个包装器。工作单元转到数据库谢谢。在我的示例代码中,我只显示了一个属性,它需要数据库中的对象。事实上我有6个。我现在应该创建6个方法来从数据库中获取对象吗?还是有其他更整洁的方式?谢谢。在我的示例代码中,我只显示了一个属性,它需要数据库中的对象。事实上我有6个。我现在应该创建6个方法来从数据库中获取对象吗?还是有其他更整洁的方式?谢谢!LINQ2SQL在Linq查询中总是优先吗?我的意思是,它也是一个Linq到Xml的查询。。Edit:null是一个有效值:编译器从上下文推断LINQ表达式是要强制转换为表达式还是仅转换为普通Func。在这种情况下,表达式在运行时被翻译成其他语言SQL,而Funcs是正常编译的。你知道为什么吗
编译器将此查询转换为SQL?为什么不使用Xml?我的意思是,我现在同时使用XML和SQL,但编译器“选择”使用SQL。我不明白。编译器看到域是DB上下文,因此知道括号内的代码必须通过表达式API转换为SQL。谷歌让LINQ expression API了解更多。呵呵,我在你编辑你的评论时发表了我的评论:我在谷歌上搜索了LINQ expression API,但找不到我认为你提到的东西。你的表达是指树吗?谢谢!LINQ2SQL在Linq查询中总是优先吗?我的意思是,它也是一个Linq到Xml的查询。。Edit:null是一个有效值:编译器从上下文推断LINQ表达式是要强制转换为表达式还是仅转换为普通Func。在这种情况下,表达式在运行时被翻译成其他语言SQL,而Funcs是正常编译的。您知道编译器为什么将此查询翻译成SQL吗?为什么不使用Xml?我的意思是,我现在同时使用XML和SQL,但编译器“选择”使用SQL。我不明白。编译器看到域是DB上下文,因此知道括号内的代码必须通过表达式API转换为SQL。谷歌让LINQ expression API了解更多。呵呵,我在你编辑你的评论时发表了我的评论:我在谷歌上搜索了LINQ expression API,但找不到我认为你提到的东西。你的表达是指树吗?