- نگارش تولیدی بر اساس هش محتوای فایل محاسبه میشود به صورت خودکار.
- در وب فرمها هم این قابلیت مدتی هست که وجود دارد: (^)
Ingredient[] ingredients = { new Ingredient{Name = "Sugar", Calories=500}, new Ingredient{Name = "Lard", Calories=500}, new Ingredient{Name = "Butter", Calories=500}, new Ingredient{Name = "Egg", Calories=100}, new Ingredient{Name = "Milk", Calories=100}, new Ingredient{Name = "Flour", Calories=50}, new Ingredient{Name = "Oats", Calories=50} }; IEnumerable<IGrouping<int, Ingredient>> query = from i in ingredients group i by i.Calories; foreach (IGrouping<int, Ingredient> group in query) { Console.WriteLine($"Ingredients with {group.Key} calories"); foreach (Ingredient ingredient in group) { Console.WriteLine($"- { ingredient.Name}"); } }
Ingredients with 500 calories - Sugar - Lard - Butter Ingredients with 100 calories - Egg - Milk Ingredients with 50 calories - Flour - Oats
IOrderedEnumerable<Ingredient> sortedByNameQuery = from i in ingredients orderby i.Name select i; foreach (var ingredient in sortedByNameQuery) { Console.WriteLine(ingredient.Name); }
Butter Egg Flour Lard Milk Oats Sugar
IOrderedEnumerable<Ingredient> sortedByNameQuery = from i in ingredients orderby i.Name descending select i;
Sugar Oats Milk Lard Flour Egg Butter
Ingredient[] ingredients = { new Ingredient{Name = "Sugar", Calories=500}, new Ingredient{Name = "Lard", Calories=500}, new Ingredient{Name = "Butter", Calories=500}, new Ingredient{Name = "Egg", Calories=100}, new Ingredient{Name = "Milk", Calories=100}, new Ingredient{Name = "Flour", Calories=50}, new Ingredient{Name = "Oats", Calories=50} }; IEnumerable<IGrouping<int, Ingredient>> query = from i in ingredients group i by i.Calories into calorieGroup orderby calorieGroup.Key select calorieGroup; foreach (IGrouping<int, Ingredient> group in query) { Console.WriteLine($"Ingredients with {group.Key} calories"); foreach (Ingredient ingredient in group) { Console.WriteLine($"- { ingredient.Name}"); } }
Ingredients with 50 calories - Flour - Oats Ingredients with 100 calories - Egg - Milk Ingredients with 500 calories - Sugar - Lard - Butter
var q1 = ingredients.Where(x => x.Calories > 100); var q2 = from i in ingredients where i.Calories > 100 select i;
int mixedQuery = (from i in ingredients where i.Calories > 100 select i).Count();
موقعی که از کاربر یک عکس رو دریافت میکنیم نیازه که بررسی شه که آیا این فایل واقعا عکسه یا نه.
برای کنترل این موضوع Attributeهای اعتبارسنجی بهترین انتخاب هستن و با یکبار افزودن میتوان از آنها در هر جایی استفاده کرد.
سمت سرور اینکار به این صورت هست ^
اما سمت کلاینت حتی اگه بیایم فرمت فایل رو هم بررسی کنیم بازهم جوابگو نیست و میشه به راحتی فرمت یک فایل ZIP رو به PNG تغییر داد و ارسالش کرد و عملا اعتبارسنجی سمت کلاینت کار خاصی رو انجام نمیده.
در این پروژه Attribute اعتبارسنجی برای بررسی فایل که آیا واقعا عکس هست یا نه نوشته شده، هم سمت کلاینت و هم سمت سرور.
نحوه انجام کار: برای سمت کلاینت عکسی که کاربر وارد میکنه رو در داخل تگ IMG نمایش میده و اگه عکس به درستی لود بشه رخداد OnLoad تگ IMG فراخوانی میشه و اعتبارسنجی پاس میشه.
تگ IMG به کاربر نمایش داده نمیشه و به صورت display: none هستش.
از این Attribute اعتبارسنجی در کنار Attributeهای کنترل حجم فایل هم میشه استفاده کرد که قبل از اینکه بخوایم بررسی کنیم که آیا فایل واقعا عکسه یا نه ابتدا حجم فایل مورد بررسی قرار بگیره.
Query: Regression in EF 6.1.2: OUTER APPLY introduced and more compex queries for 1:1 relationships and "let" clauseTPT problem with hiding base class property in inherited classDbMigration.Sql fails when the word 'go' is contained in the textCreate compatibility flag for UnionAll and Intersect flattening supportQuery with multiple Includes does not work in 6.1.2 (working in 6.1.1)"You have an error in your SQL syntax" after upgrading from EF 6.1.1 to 6.1.2
public interface IMyOperation { void DoIt(); }
public void DoIt() { Console.WriteLine( "this is main block of code" ); }
public class Logger { const string path = @"D:\Log.txt"; public static void WriteToFile( string methodName ) { object lockObject = new object(); if ( !File.Exists( path ) ) { File.Create( path ); } lock ( lockObject ) { using ( TextWriter writer = new StreamWriter( path , true ) ) { writer.WriteLine( string.Format( "{0} at {1}" , methodName , DateTime.Now ) ); } } } }
public class LogHandler : ICallHandler { public IMethodReturn Invoke( IMethodInvocation input , GetNextHandlerDelegate getNext ) { Logger.WriteToFile( input.MethodBase.Name ); var methodReturn = getNext()( input , getNext ); return methodReturn; } public int Order { get; set; } }
var methodReturn = getNext()( input , getNext );
public class LogAttribute : HandlerAttribute { public override ICallHandler CreateHandler( Microsoft.Practices.Unity.IUnityContainer container ) { return new LogHandler(); } }
var unityContainer = new UnityContainer(); unityContainer.AddNewExtension<Interception>(); unityContainer.Configure<Interception>().SetDefaultInterceptorFor<IMyOperation>( new InterfaceInterceptor() ); unityContainer.RegisterType<IMyOperation, MyOperation>();
var container = new UnityContainer(); container.RegisterType<Book , Book>(); container.AddNewExtension<Interception>(); var policy = container.Configure<Interception>().SetDefaultInterceptorFor<Book>( new VirtualMethodInterceptor() ).AddPolicy( "MyPolicy" ); policy.AddMatchingRule( new PropertyMatchingRule( "*" , PropertyMatchingOption.Set ) ); policy.AddCallHandler<Handler.NotifyChangedHandler>();