这是方法:
public IEnumerable<???> GetAllSiteVisits()
{
var visits =
_db.STEWARDSHIP
.OrderByDescending(r => r.VISIT_DATE)
.Select(r => new
{
id = r.STEWARDSHIP_ID,
name = r.SITE.SITE_NAME,
visit_date = r.VISIT_DATE,
visit_type = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
});
return visits;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Entity Framework 4.2.
所以问题在于找出返回类型.如果我只是直接从数据库表中使用信息,我会返回,IEnumerable<STEWARDSHIP>但由于我只选择某些字段,我不明白返回类型是什么.
我已从EF 4.0升级到EF 4.2
我的上下文继承自ObjectContext.
强类型Include方法(在结果中包含链接的实体)在我的实体集(继承自ObjectSet)上不可用.
为什么?
c# linq-to-entities entity-framework entity-framework-4 entity-framework-4.1
以拉迪斯拉夫的回答为基础
我正在尝试创建一个包装器类型EfObservableCollection<T>,ObservableCollection<T>它有一个额外的帮助器属性来简化持久性(当然这个解决方案有权衡,但它对我的域来说似乎是可行的).
但是,EfObservableCollection<T>EF似乎忽略了类型的属性.没有在数据库中创建适当的列.猜测实现IEnumerable<T>可能会触发EF忽略该类型,我注意到该实现没有改变行为.
我在这里错过了什么?
实体类
public class A
{
[DataMember]
public long Id { get; set; }
[DataMember]
public string Text { get; set; }
// Tags is not persisted
[DataMember]
public EfObservableCollection<string> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
包装类
[ComplexType]
public class EfObservableCollection<T> : IEnumerable<T>
{
const string VALUE_SEPARATOR = "\x8"; // Backspace character. Unlikely to be actually entered by a user. Assumes ASCII or UTF-8.
readonly string[] VALUE_SEPARATORS = …Run Code Online (Sandbox Code Playgroud) 我使用asp.net mvc 3与WCF与EF 4.1与Sql Azure.我正在为我的应用程序构建搜索引擎.并使用动态Linq来构建查询.我想在这种情况下避免使用sql注入.同样的最佳做法是什么?在这种情况下我应该采取什么预防措施?
我有一个存储过程在我的asp.net mvc3应用程序中使用Entity Framework:
CREATE PROCEDURE dbo.MinMax
AS
DECLARE @T1 TABLE(MinColorsId int,MAXColorsId int)
INSERT @T1
select MIN(ColorsId) as MinColorsId,MAX(ColorsId) as MAXColorsId
from DiamondInfoes
SELECT * FROM @T1
RETURN
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我有与过程表结果相同的属性名称:
public class colorModel
{
[Display(Name = "MinColorsId")]
public float MinColorsId { get; set; }
[Display(Name = "MaxColorsId")]
public float MaxColorsId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在控制器中我运行存储过程:
private _ModelContainer m_db = new _ModelContainer();
var minmax = m_db.MinMax();
Run Code Online (Sandbox Code Playgroud)
我想设置包含程序结果colorModel的minmax那个?(简而言之,我有很多属性...)
我试图简单地加载一个实体,修改一个属性,然后将其保存回数据库.
var db = new NewsletterContext();
var newsletter = db.Newsletters.Find(x => x.ID==newsletterID);
newsletter.SomeProperty = 5;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这会导致验证错误,因为新闻稿对象上有一些属性是必需的,当我这样做时显然没有加载Find().
我可以使用Include()for每个必需的属性来解决这个问题,然后是Where():
var db = new NewsletterContext();
var newsletter = db.Newsletters.Include(x => x.RequiredProp1)
.Include(x => x.RequiredProp2).Include(x => x.RequiredProp3)
.Where(x => x.ID==newsletterID)
.FirstOrDefault();
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这不是一个非常优雅的解决方案,如果我向Newsletter对象添加更多必需属性,它将会中断.
有更好的解决方案吗?
请考虑以下代码:
public abstract class RepositoryBase<T> where T : class
{
#region Members
private MyContext dataContext;
private readonly IDbSet<T> dbset;
#endregion
protected RepositoryBase(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = DataContext.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get; private set;
}
protected MyContext DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Delete(T entity)
{
dbset.Remove(entity);
}
Run Code Online (Sandbox Code Playgroud)
我想用下面的方法替换Delete方法,因为我更愿意在我的对象中简单地将Deleted字段设置为true以指示它被删除,而不是真正删除它.
public virtual void Delete(T entity)
{
entity.Deleted = true;
dbset.Attach(entity);
dataContext.Entry(entity).State = EntityState.Modified;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用POCO实体,并且所有这些实体都存在Deleted属性.但是,在上面的代码中,实体的类型为T,并且T"不知道"它可以表示的所有对象中都有Deleted属性.解决这个问题最优雅的方法是什么?
顺便说一句,我想在我的抽象类中以类似的方式访问其他字段(DateCreated,CreatedBy,DateModified和ModifiedBy).
更新:我尝试了接口和Abstract类解决方案,起初看起来很不错,但是在编译时两种情况下我都收到以下错误消息: …
我有以下数据:
PK OrderNumber USERDEFFIELD
1 0001 10
2 0001 25
3 0002 20
4 0002 22
5 0002 NULL
6 0003 ABC123
Run Code Online (Sandbox Code Playgroud)
UserDefField列在数据库中是VARCHAR类型.使用LINQ,我如何获得每个订单的SUM(UserDefField)?UserDefField的NULL和非数字值将被视为零.我想要得到的结果:
OrderNumber TotalQty
0001 35
0002 42
0003 0
Run Code Online (Sandbox Code Playgroud)
如果UserDefField是严格可以为空的数字字段,我知道我会在foreach循环中执行此操作:
TotalQtyForThisOrder = orders.Sum(w => w.UserDefField ?? 0 );
Run Code Online (Sandbox Code Playgroud)
但是对于字符串字段,应该做什么?非常感谢你的帮助.
我很快就会加入一个他们正在从事上述技术工作的新团队.我来自asp.net背景,并没有在这些技术任何工作.请建议好的资源,以及哪一个开始学习.
谢谢
我有一个堆栈溢出错误,我很确定我没有任何类型的无限递归(至少我已经盯着错误几个小时了,我无法想象它的无限循环).
这是代码:
public decimal? Amount
{
get
{
if (!string.IsNullOrEmpty(_savedWork.Amount))
return decimal.Parse(_savedWork.Amount);
else
return null;
}
set
{
if (value.HasValue)
{
_savedWork.Amount = value.Value.ToString();
Percent = null;
}
else
_savedWork.Amount = "";
OnPropertyChanged("Amount");
}
}
Run Code Online (Sandbox Code Playgroud)
#Note我有一个以可以为空的十进制字符串的字符串,这就是我转换它的原因.请不要让我说明为什么我这样做.
这条线savedWork.Amount = value.Value.ToString()是我得到错误的地方.
基本上我认为我的堆栈太小(或者我认为我的代码太大了).我基本上运行这个代码两次,它在一种形式下工作,但是当我制作另一种形式并将其放在那里时,我不认为这两种形式之间的区别在于倾斜堆栈.
有没有办法确定我做错了什么?我想知道代码的哪些部分占用太多或持续时间太长等.
我已经做了一些关于堆栈/堆如何工作的研究,我知道PerfMon.exe,但据我所知它只适用于堆.是否有类似的工具,我可以用于我的程序正在运行的堆栈?
我发现这个帖子大约有两个名为windbg和cdb的工具,但我找不到很多关于如何安装/使用它们的信息.这些工具是正确的方法吗?
或者,如果存在无限循环或某些事情会很棒.
这里是Amount属性请求的代码(由EntityFramework自动生成)正如我在评论中所说,步骤甚至没有到达这里.我确实认为我的堆栈限制正在达到.
public global::System.String Amount
{
get
{
return _Amount;
}
set
{
OnAmountChanging(value);
ReportPropertyChanging("Amount");
_Amount = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("Amount");
OnAmountChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
好的,Meta-Knight的回答告诉我,我确实有一个无限循环.我有一个事件处理程序订阅了DisplayTypeOfInvestment的PropertyChanged事件(Amount属性所属的类).处理程序看起来像这样: …