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,但找不到我认为你提到的东西。你的表达是指树吗?